<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>yang&#039;s blog</title>
	<atom:link href="http://y_z.scripts.mit.edu/wp/feed/" rel="self" type="application/rss+xml" />
	<link>http://y_z.scripts.mit.edu/wp</link>
	<description>on systems hackery</description>
	<lastBuildDate>Tue, 24 Nov 2009 02:29:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Recovering files using TestDisk</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/11/23/recovering-files-using-testdisk/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/11/23/recovering-files-using-testdisk/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 02:29:15 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[computing]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=469</guid>
		<description><![CDATA[I recently had a hard disk go bad. It had a single NTFS partition where the partition was no longer recognized by Windows or Linux.I managed to recover (I think) all of my files by reading the data off of the disk using TestDisk. It discovered my partition without issue, and the actual file recovery [...]]]></description>
			<content:encoded><![CDATA[<p
>I recently had a hard disk go bad. It had a single NTFS partition where the partition was no longer recognized by Windows or Linux.</p
><p
>I managed to recover (I think) all of my files by reading the data off of the disk using <a href="http://www.cgsecurity.org/wiki/TestDisk"
  >TestDisk</a
  >. It discovered my partition without issue, and the actual file recovery went relatively smoothly.</p
><p
>I believe the way TestDisk was primarily designed to work was by attempting to actually repair the partition. This should be fine if you&rsquo;re working on a copy of the raw disk bits (you can probably use <a href="http://www.chrysocome.net/dd"
  >dd for Windows</a
  > for this, or write a program that accesses ), but I&rsquo;d generally be averse to making any further changes to a bad disk. I chose to recover my data just by copying the files directly out. You can do this as follows:</p
><ul
><li
  >go to (your disk) &gt; Intel &gt; Analyse &gt; (your dynamic partition)</li
  ><li
  >highlight your partition</li
  ><li
  >press P to list files</li
  ><li
  >press H to hide deleted files</li
  ><li
  >press C to copy the current directory</li
  ></ul
><p
>One thing to watch out for when using this approach is to first make sure you press H to hide deleted files. Otherwise, you end up recovering deleted files as well, and sometimes these deleted files (for whatever reason&mdash;probably because my data&rsquo;s sufficiently corrupted) end up pointing back into the root of the file system, leading to cycles in the tree and thus an infinitely recursive file copying procedure.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/11/23/recovering-files-using-testdisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boost.Coroutine</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/11/07/boost-coroutine/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/11/07/boost-coroutine/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 09:57:42 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=458</guid>
		<description><![CDATA[A while back, I wrote about cooperative threading libraries for C++. Coroutines are a closely related concept&#8212;coroutines and cooperative threads can be expressed/implemented in terms of each other.Conspicuously absent from that coverage is Boost.Coroutine, which I&#8217;ll discuss here. The problem with Boost.Coroutine is that it was incomplete, and&#8212;last I checked&#8212;far from complete. I had spent [...]]]></description>
			<content:encoded><![CDATA[<p
>A while back, I wrote about <a href="http://y_z.scripts.mit.edu/wp/2009/03/24/cooperative-threads-for-cc/"
  >cooperative threading libraries for C++</a
  >. <a href="http://en.wikipedia.org/wiki/Coroutine"
  >Coroutines</a
  > are a closely related concept&mdash;coroutines and cooperative threads can be expressed/implemented in terms of each other.</p
><p
>Conspicuously absent from that coverage is <a href="http://www.crystalclearsoftware.com/soc/coroutine/"
  >Boost.Coroutine</a
  >, which I&rsquo;ll discuss here. The problem with Boost.Coroutine is that it was incomplete, and&mdash;last I checked&mdash;far from complete. I had spent some time trying to work with the author through its non-starter issues, as I was looking forward to using it in conjunction with Boost.Asio (this was one of Boost.Coroutine&rsquo;s primary objectives), but the author has not had the time to take his work to the Boost formal review stage.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/11/07/boost-coroutine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Re-enabling desktop effects in Windows 7</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/11/07/re-enabling-desktop-effects-in-windows-7/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/11/07/re-enabling-desktop-effects-in-windows-7/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 07:50:32 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[quick tips]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=454</guid>
		<description><![CDATA[Every once in a while, Windows 7&#8217;s Desktop Window Manager (DWM) spontaneously goes funky on me and loses its effects (transparency, blurring, shadows).When this happens, you can get your effects back by going to Services and restarting the &#8220;Desktop Window Manager Session Manager&#8221; service, or by going to an Administrative command prompt and running:net stop [...]]]></description>
			<content:encoded><![CDATA[<p
>Every once in a while, Windows 7&rsquo;s Desktop Window Manager (DWM) spontaneously goes funky on me and loses its effects (transparency, blurring, shadows).</p
><p
>When this happens, you can get your effects back by going to Services and restarting the &ldquo;Desktop Window Manager Session Manager&rdquo; service, or by going to an Administrative command prompt and running:</p
><pre
><code
  >net stop uxsms
net start uxsms
</code
  ></pre
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/11/07/re-enabling-desktop-effects-in-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++0x lambdas in GCC 4.5</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/11/03/c0x-lambdas-in-gcc-4-5/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/11/03/c0x-lambdas-in-gcc-4-5/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:30:00 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=438</guid>
		<description><![CDATA[Lambdas are coming in GCC 4.5. With this I&#8217;ve rid myself of the clamp hack. You can start using lambdas today by just grabbing a GCC snapshot:svn co -q svn://gcc.gnu.org/svn/gcc/trunksudo aptitude build-dep gcc-4.4 # get prereqs./configure --program-suffix=-4.5 --disable-libgcj \    --enable-languages=c++makesudo make install# test it outecho 'int main() { []{}; return 0; }' [...]]]></description>
			<content:encoded><![CDATA[<p
><a href="http://www.weiqigao.com/blog/2008/03/30/closures_comes_to_c0x.html"
  >Lambdas</a
  > are <a href="http://gcc.gnu.org/ml/gcc/2009-09/msg00507.html"
  >coming in GCC 4.5</a
  >. With this I&rsquo;ve rid myself of the <a href="http://y_z.scripts.mit.edu/wp/2009/03/04/the-c-lamda-preprocessor/"
  >clamp hack</a
  >. You can start using lambdas today by just grabbing a GCC snapshot:</p
><pre class="sourceCode bash"
><code
  ><span class="Normal NormalText"
    >svn </span
    ><span class="Keyword Command"
    >co</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Option"
    >-q</span
    ><span class="Normal NormalText"
    > svn:</span
    ><span class="Normal Path"
    >//gcc.gnu.org/svn/gcc/trunk</span
    ><br
     /><span class="Keyword Command"
    >sudo</span
    ><span class="Normal NormalText"
    > aptitude build</span
    ><span class="Normal Option"
    >-dep</span
    ><span class="Normal NormalText"
    > gcc</span
    ><span class="Normal Option"
    >-4</span
    ><span class="Normal NormalText"
    >.4 </span
    ><span class="Comment"
    ># get prereqs</span
    ><br
     /><span class="Normal Path"
    >./configure</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Option"
    >--program-suffix</span
    ><span class="Normal NormalText"
    >=</span
    ><span class="Normal Option"
    >-4</span
    ><span class="Normal NormalText"
    >.5 </span
    ><span class="Normal Option"
    >--disable-libgcj</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Keyword"
    >\</span
    ><br
     /><span class="Normal NormalText"
    >    </span
    ><span class="Normal Option"
    >--enable-languages</span
    ><span class="Normal NormalText"
    >=c++</span
    ><br
     /><span class="Keyword Command"
    >make</span
    ><br
     /><span class="Keyword Command"
    >sudo</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Keyword Command"
    >make</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Keyword Command"
    >install</span
    ><br
     /><span class="Comment"
    ># test it out</span
    ><br
     /><span class="Keyword Builtin"
    >echo</span
    ><span class="Normal NormalText"
    > </span
    ><span class="String StringSingleQ"
    >'int main() { []{}; return 0; }'</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Keyword Redirection"
    >&gt;</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Path"
    >/tmp/nop.cc</span
    ><br
     /><span class="Normal NormalText"
    >g++</span
    ><span class="Normal Option"
    >-4</span
    ><span class="Normal NormalText"
    >.5 </span
    ><span class="Normal Option"
    >-std</span
    ><span class="Normal NormalText"
    >=gnu++0x </span
    ><span class="Normal Option"
    >-o</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Path"
    >/tmp</span
    ><span class="Normal NormalText"
    >/nop</span
    ><span class="DataType Escape"
    >{,.cc}</span
    ><br
     /></code
  ></pre
><p
>Here&rsquo;s a simple program from my <a href="http://assorted.svn.sourceforge.net/viewvc/assorted/sandbox/trunk/src/cc/"
  >C++ sandbox</a
  > showing off just a few of C++0x&rsquo;s slew of new features:</p
><pre class="sourceCode cpp"
><code
  ><span class="Others Preprocessor"
    >#define _GLIBCXX_USE_NANOSLEEP</span
    ><br
     /><span class="Others Preprocessor"
    >#include </span
    ><span class="Others Prep.Lib"
    >&lt;functional&gt;</span
    ><br
     /><span class="Others Preprocessor"
    >#include </span
    ><span class="Others Prep.Lib"
    >&lt;iostream&gt;</span
    ><br
     /><span class="Others Preprocessor"
    >#include </span
    ><span class="Others Prep.Lib"
    >&lt;string&gt;</span
    ><br
     /><span class="Others Preprocessor"
    >#include </span
    ><span class="Others Prep.Lib"
    >&lt;thread&gt;</span
    ><br
     /><span class="Others Preprocessor"
    >#include </span
    ><span class="Others Prep.Lib"
    >&lt;vector&gt;</span
    ><br
     /><br
     /><span class="Keyword"
    >using</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Keyword"
    >namespace</span
    ><span class="Normal NormalText"
    > std</span
    ><span class="Normal Symbol"
    >;</span
    ><br
     /><span class="DataType DataType"
    >int</span
    ><span class="Normal NormalText"
    > main</span
    ><span class="Normal Symbol"
    >()</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >{</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// strongly typed enums</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// can specify underlying type</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Keyword"
    >enum</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Keyword"
    >class</span
    ><span class="Normal NormalText"
    > msg_type </span
    ><span class="Normal Symbol"
    >:</span
    ><span class="Normal NormalText"
    > </span
    ><span class="DataType DataType"
    >uint8_t</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >{</span
    ><span class="Normal NormalText"
    > hello</span
    ><span class="Normal Symbol"
    >,</span
    ><span class="Normal NormalText"
    > world </span
    ><span class="Normal Symbol"
    >};</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// initializer lists for easy init</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// no more `&gt;&gt;` misparsing</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="DataType DataType"
    >const</span
    ><span class="Normal NormalText"
    > vector</span
    ><span class="Normal Symbol"
    >&lt;</span
    ><span class="Normal NormalText"
    >pair</span
    ><span class="Normal Symbol"
    >&lt;</span
    ><span class="DataType DataType"
    >int</span
    ><span class="Normal Symbol"
    >,</span
    ><span class="Normal NormalText"
    > string</span
    ><span class="Normal Symbol"
    >&gt;&gt;</span
    ><span class="Normal NormalText"
    > xs </span
    ><span class="Normal Symbol"
    >=</span
    ><br
     /><span class="Normal NormalText"
    >    </span
    ><span class="Normal Symbol"
    >{{</span
    ><span class="DecVal Decimal"
    >1</span
    ><span class="Normal Symbol"
    >,</span
    ><span class="Normal NormalText"
    > </span
    ><span class="String"
    >&quot;hello&quot;</span
    ><span class="Normal Symbol"
    >},</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >{</span
    ><span class="DecVal Decimal"
    >3</span
    ><span class="Normal Symbol"
    >,</span
    ><span class="Normal NormalText"
    > </span
    ><span class="String"
    >&quot;world&quot;</span
    ><span class="Normal Symbol"
    >}};</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// standard classes for concurrency</span
    ><br
     /><span class="Normal NormalText"
    >  vector</span
    ><span class="Normal Symbol"
    >&lt;</span
    ><span class="Normal NormalText"
    >thread</span
    ><span class="Normal Symbol"
    >&gt;</span
    ><span class="Normal NormalText"
    > ts</span
    ><span class="Normal Symbol"
    >;</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// type inference with repurposed `auto`</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Comment"
    >// no need for `vector&lt;string&gt;::const_iterator`</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Keyword"
    >for</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >(</span
    ><span class="DataType DataType"
    >auto</span
    ><span class="Normal NormalText"
    > x </span
    ><span class="Normal Symbol"
    >=</span
    ><span class="Normal NormalText"
    > xs</span
    ><span class="Normal Symbol"
    >.</span
    ><span class="Normal NormalText"
    >begin</span
    ><span class="Normal Symbol"
    >();</span
    ><span class="Normal NormalText"
    > x </span
    ><span class="Normal Symbol"
    >!=</span
    ><span class="Normal NormalText"
    > xs</span
    ><span class="Normal Symbol"
    >.</span
    ><span class="Normal NormalText"
    >end</span
    ><span class="Normal Symbol"
    >();</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >++</span
    ><span class="Normal NormalText"
    >x</span
    ><span class="Normal Symbol"
    >)</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >{</span
    ><br
     /><span class="Normal NormalText"
    >    </span
    ><span class="Comment"
    >// new function class</span
    ><br
     /><span class="Normal NormalText"
    >    </span
    ><span class="Comment"
    >// could also use `auto` here</span
    ><br
     /><span class="Normal NormalText"
    >    </span
    ><span class="Comment"
    >// here's a lambda that captures x by value</span
    ><br
     /><span class="Normal NormalText"
    >    function</span
    ><span class="Normal Symbol"
    >&lt;</span
    ><span class="DataType DataType"
    >void</span
    ><span class="Normal Symbol"
    >()&gt;</span
    ><span class="Normal NormalText"
    > f </span
    ><span class="Normal Symbol"
    >=</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >[=]{</span
    ><br
     /><span class="Normal NormalText"
    >      </span
    ><span class="Comment"
    >// new chrono class</span
    ><br
     /><span class="Normal NormalText"
    >      std</span
    ><span class="Normal Symbol"
    >::</span
    ><span class="Normal NormalText"
    >this_thread</span
    ><span class="Normal Symbol"
    >::</span
    ><span class="Normal NormalText"
    >sleep_for</span
    ><span class="Normal Symbol"
    >(</span
    ><br
     /><span class="Normal NormalText"
    >        chrono</span
    ><span class="Normal Symbol"
    >::</span
    ><span class="Normal NormalText"
    >seconds</span
    ><span class="Normal Symbol"
    >(</span
    ><span class="Normal NormalText"
    >x</span
    ><span class="Normal Symbol"
    >-&gt;</span
    ><span class="Normal NormalText"
    >first</span
    ><span class="Normal Symbol"
    >));</span
    ><br
     /><span class="Normal NormalText"
    >      cout </span
    ><span class="Normal Symbol"
    >&lt;&lt;</span
    ><span class="Normal NormalText"
    > x</span
    ><span class="Normal Symbol"
    >-&gt;</span
    ><span class="Normal NormalText"
    >second </span
    ><span class="Normal Symbol"
    >&lt;&lt;</span
    ><span class="Normal NormalText"
    > endl</span
    ><span class="Normal Symbol"
    >;</span
    ><br
     /><span class="Normal NormalText"
    >    </span
    ><span class="Normal Symbol"
    >};</span
    ><br
     /><span class="Normal NormalText"
    >    ts</span
    ><span class="Normal Symbol"
    >.</span
    ><span class="Normal NormalText"
    >push_back</span
    ><span class="Normal Symbol"
    >(</span
    ><span class="Normal NormalText"
    >thread</span
    ><span class="Normal Symbol"
    >(</span
    ><span class="Normal NormalText"
    >f</span
    ><span class="Normal Symbol"
    >));</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Normal Symbol"
    >}</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Keyword"
    >for</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >(</span
    ><span class="DataType DataType"
    >auto</span
    ><span class="Normal NormalText"
    > t </span
    ><span class="Normal Symbol"
    >=</span
    ><span class="Normal NormalText"
    > ts</span
    ><span class="Normal Symbol"
    >.</span
    ><span class="Normal NormalText"
    >begin</span
    ><span class="Normal Symbol"
    >();</span
    ><span class="Normal NormalText"
    > t </span
    ><span class="Normal Symbol"
    >!=</span
    ><span class="Normal NormalText"
    > ts</span
    ><span class="Normal Symbol"
    >.</span
    ><span class="Normal NormalText"
    >end</span
    ><span class="Normal Symbol"
    >();</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >++</span
    ><span class="Normal NormalText"
    >t</span
    ><span class="Normal Symbol"
    >)</span
    ><span class="Normal NormalText"
    > </span
    ><span class="Normal Symbol"
    >{</span
    ><br
     /><span class="Normal NormalText"
    >    t</span
    ><span class="Normal Symbol"
    >-&gt;</span
    ><span class="Normal NormalText"
    >join</span
    ><span class="Normal Symbol"
    >();</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Normal Symbol"
    >}</span
    ><br
     /><span class="Normal NormalText"
    >  </span
    ><span class="Keyword"
    >return</span
    ><span class="Normal NormalText"
    > </span
    ><span class="DecVal Decimal"
    >0</span
    ><span class="Normal Symbol"
    >;</span
    ><br
     /><span class="Normal Symbol"
    >}</span
    ><br
     /></code
  ></pre
><p
>Compile it with:</p
><pre
><code
  >g++-4.5 -std=gnu++0x -pthread -o c++0x{,.cc}
</code
  ></pre
><p
><a href="http://gcc.gnu.org/projects/cxx0x.html"
  >Other features</a
  > are coming down the pipe as well. Wikipedia has good <a href="http://en.wikipedia.org/wiki/C%2B%2B0x"
  >high-level overviews</a
  > of these and more.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/11/03/c0x-lambdas-in-gcc-4-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes wiki</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/10/18/notes-wiki/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/10/18/notes-wiki/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 06:44:16 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[research]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=434</guid>
		<description><![CDATA[I started using a gitit wiki to maintain my notes on CS research and programming. It&#8217;s available here. For a while, I&#8217;ve kept my notes in a bunch of &#8220;loosely pandoc&#8221; files, so gitit was an easy way to wiki-fy everything&#8212;to make them easier to view/edit from any browser, and to share publicly.At the moment [...]]]></description>
			<content:encoded><![CDATA[<p
>I started using a <a href="http://www.gitit.net/"
  >gitit</a
  > wiki to maintain my notes on CS research and programming. It&rsquo;s available <a href="http://zs.ath.cx:5001/"
  >here</a
  >. For a while, I&rsquo;ve kept my notes in a bunch of &ldquo;loosely <a href="http://johnmacfarlane.net/pandoc/"
  >pandoc</a
  >&rdquo; files, so gitit was an easy way to wiki-fy everything&mdash;to make them easier to view/edit from any browser, and to share publicly.</p
><p
>At the moment my notes are highly disorganized and probably have many formatting bugs. Also, they typically don&rsquo;t include topics from classes I&rsquo;ve taken. I&rsquo;m hoping this will become a not-too-cryptic way for me to share more information with less effort than writing blog posts.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/10/18/notes-wiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting started with Windows kernel development</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/09/25/getting-started-with-windows-kernel-development/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/09/25/getting-started-with-windows-kernel-development/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 22:59:47 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=362</guid>
		<description><![CDATA[I&#8217;m diving into Windows development here in MSR Redmond&#8217;s OS group. I have mainly a Linux background and know much less about Windows, so I&#8217;ve been taking notes. I&#8217;ll be publishing an assortment of these notes/tips. Today I&#8217;ll talk about kernel-mode development and debugging basics.Windows kernel module/driver binaries are .sys files (like .ko files on [...]]]></description>
			<content:encoded><![CDATA[<p
>I&rsquo;m diving into Windows development here in MSR Redmond&rsquo;s OS group. I have mainly a Linux background and know much less about Windows, so I&rsquo;ve been taking notes. I&rsquo;ll be publishing an assortment of these notes/tips. Today I&rsquo;ll talk about kernel-mode development and debugging basics.</p
><p
>Windows kernel module/driver binaries are <code
  >.sys</code
  > files (like <code
  >.ko</code
  > files on Linux), which may be accompanied by a <code
  >.pdb</code
  > file containing the debug symbols for the binary. <a href="http://www.catch22.net/tuts/kernel101"
  >Kernel Programming 101</a
  > is a nice introductory tutorial on how to write and build these drivers, but the section on loading them manually by editing the registry doesn&rsquo;t work in Windows 7 (perhaps this was XP-and-earlier). You should use the <a href="http://www.osronline.com/article.cfm?article=157"
  >DriverLoader</a
  > tool from <a href="http://www.osronline.com/"
  >OSR Online</a
  > to register your driver as a service and start it; it probably uses the <a href="http://stackoverflow.com/questions/499359/which-api-functions-to-install-a-file-system-driver-in-windows"
  >Windows API</a
  > to accomplish this. By the way, OSR Online is a useful website and community for Windows kernel hacking that puts out other tools as well.</p
><p
><a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx"
  ><code
    >windbg</code
    ></a
  > (&ldquo;windbag&rdquo;) is a handy multi-purpose debugger, included in the <a href="http://www.microsoft.com/whdc/devtools/wdk/default.mspx"
  >Windows Driver Kit</a
  >. It used to be a userland-only debugger, whereas <code
  >kd</code
  > was the kernel debugger, but all debugging functionality has been merged into one place, used by both <code
  >windbg</code
  > and <code
  >ntsd</code
  >. <code
  >ntsd</code
  > is a command-line debugger, whereas <code
  >windbg</code
  > has a GUI and a bunch of other nifty features, such as the ability to pull symbols (those <code
  >.pdb</code
  > files) and sources automatically from symbol servers and source servers. I used to use <code
  >windbg</code
  > to analyze those crash dumps that are produced whenever you get a BSOD; the stack trace may provide hints as to the source of the problem.</p
><p
>In the 64-bit versions of Windows Vista and Windows 7, you can normally only load signed drivers. To disable this requirement, start Windows in debug mode. Typically you&rsquo;ll want to debug a Windows environment running in a VM like Virtual PC. To debug Windows over the virtual COM serial port, the first step is to run the following from an Administrator <code
  >cmd</code
  > and reboot:</p
><pre
><code
  >bcdedit -debug on
bcdedit -dbgsettings serial debugport:1 baudrate:115200
</code
  ></pre
><p
><code
  >bcdedit</code
  > is a program that edits boot settings, which once upon a time were configured in a file called <code
  >boot.ini</code
  >. There are <a href="http://www.raymond.cc/blog/archives/2009/08/24/loading-unsigned-drivers-in-windows-7-and-vista-64-bit-x64/"
  >alternative instructions</a
  > on the web mentioning other things to try with <code
  >bcdedit</code
  >, which I haven&rsquo;t looked carefully at, but if you&rsquo;re doing kernel development then you may want debugging mode turned on anyway.</p
><p
>The next step is to go to your VM settings and configure the COM1 port to map to a named pipe, <code
  >\\.\pipe\&lt;pipe name&gt;</code
  >. Now you can start the debugger:</p
><pre
><code
  >set _NT_SOURCE_PATH=SRV*;
set _NT_SYMBOL_PATH=srv*c:\syms*\\symbols\symbols
windbg -k com:port=\\&lt;vpc_host_machine&gt;\pipe\&lt;pipe name&gt;,pipe,resets=0,reconnect
</code
  ></pre
><p
>The environment variables tell <code
  >windbg</code
  > about the servers from which to automatically pull symbols/sources; you&rsquo;ll need to adjust this, since <code
  >\\symbols\symbols</code
  > is a Microsoft-internal share. <code
  >resets=0</code
  > is required for Virtual PC; use <code
  >resets=2</code
  > for a competing VM product. <code
  >reconnect</code
  > waits for a named pipe if it&rsquo;s not found on the target and waits to reconnect if disconnected. <code
  >vpc_host_machine</code
  > is the name of the host running the VM; if you&rsquo;re debugging locally, use <code
  >\\.\pipe\&lt;pipe name&gt;</code
  >.</p
><p
>Side note: symbol files contain information about variable and function names. Public symbols include globals, while private symbols include everything else (locals, structs, etc.). Full symbol files contain both, whereas stripped symbol files contain just public symbols. Microsoft&rsquo;s Internet symbol server is at <a href="http://msdl.microsoft.com/download/symbols"
  ><code
    >http://msdl.microsoft.com/download/symbols</code
    ></a
  >. To use it, you can just leave the symbol server variable alone; I believe the default behavior is to use this public server. (I also believe the <code
  >.symfix</code
  > windbg command without arguments restores the default symbol path.) In my case, to also allow symbols for my own driver to be resolved, I needed to set the symbol path to the following:</p
><pre
><code
  >srv*c:\syms*\\symbols\symbols;C:\Users\...\mydriver\objchk_win7_x86
</code
  ></pre
><p
>To break down what just happened: the symbol path syntax consists of multiple semi-colon-separated paths, each of which can be a local path, a cache, or a symbol server. Here are some example components:</p
><pre
><code
  >cache*C:\syms
</code
  ></pre
><p
>uses <code
  >C:\syms</code
  > as a cache for all components to its right.</p
><pre
><code
  >srv*http://symserver/symbols
</code
  ></pre
><p
>uses <code
  >http://symserver/symbols</code
  > as a symbol server. This can also be a share, i.e.&nbsp;<code
  >\\symserver\symbols</code
  >.</p
><pre
><code
  >srv*C:\syms*http://symserver/symbols
cache*C:\syms;srv*http://symserver/symbols
</code
  ></pre
><p
>are (I think) equivalent, and use <code
  >C:\syms</code
  > as a local cache for symbols from the remote symbol server. You can specify any number of cascading intermediate caches:</p
><pre
><code
  >srv*C:\syms*\\symcache\symbols*http://symserver/symbols
</code
  ></pre
><p
>When debugging issues with symbols, use <code
  >!sym noisy</code
  > to enable verbose symbol debugging info.</p
><p
>The source path is used differently. I&rsquo;m not sure how source lookup works for built-in Windows modules, but when debugging your own drivers, the <code
  >.sys</code
  > and <code
  >.dll</code
  > files themselves contain the full local paths to the source files, so that you can list and step through your code out-of-the-box if you&rsquo;re running windbg from the same machine where you built.</p
><p
>Anyway, back to actual debugging: you can attach to the system by restarting the VM. Note that windbg can only attach when the system starts up; you can&rsquo;t attach to a running system. Once you&rsquo;re in the debugger, you can hit ctrl-break to immediately break the target machine. You can try setting a breakpoint with <code
  >bp</code
  >, e.g., <code
  >bp nt!NtReadFile</code
  >. The word before the <code
  >!</code
  > is the name of the module/driver (in this case we&rsquo;re addressing the kernel), and the word after it is the name of the subroutine to break in. Your symbol path must be set up correctly to resolve these function names to addresses. You can also set breakpoints in your own driver, such as with <code
  >bp mydriver!DriverEntry</code
  >. It&rsquo;s OK to set this before the driver is even loaded; <code
  >bp</code
  > will automatically behave like <code
  >bu</code
  >, which creates an unresolved breakpoint, to be resolved once the matching module is loaded. Note that if you update your sources while they&rsquo;re open in windbg, you must close the file to refresh it.</p
><p
>To continue, enter <code
  >g</code
  >. Play around with the debugger, and consult the documentation - the WDK is well-documented.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/09/25/getting-started-with-windows-kernel-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE and Chrome</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/09/17/ie-and-chrome/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/09/17/ie-and-chrome/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 02:47:06 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[quick tips]]></category>
		<category><![CDATA[web browsers]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=397</guid>
		<description><![CDATA[IE7 (2006) introduced Protected Mode, which runs browser tabs in separate, sandboxed processes to isolate tabs from each other and from the OS, communicating with central Broker processes that remain privileged and provide system services. Chrome&#8217;s architecture was designed similarly.IE7&#8217;s Protected Mode uses Vista&#8217;s Mandatory Integrity Control, which prevents processes from modifying any files, allowing [...]]]></description>
			<content:encoded><![CDATA[<p
>IE7 (2006) introduced <a href="http://msdn.microsoft.com/en-us/library/bb250462(VS.85).aspx"
  >Protected Mode</a
  >, which runs browser tabs in separate, sandboxed processes to isolate tabs from each other and from the OS, communicating with central Broker processes that remain privileged and provide system services. Chrome&rsquo;s architecture was designed similarly.</p
><p
>IE7&rsquo;s Protected Mode uses Vista&rsquo;s <a href="http://msdn.microsoft.com/en-us/library/bb625957.aspx"
  >Mandatory Integrity Control</a
  >, which prevents processes from modifying any files, allowing them to write only to locations marked as low, such as Temporary Internet Files. Files touched by processes are marked with their integrity level. Integrity Levels correspond to Internet Zones. Chrome on Vista also leverages MIC.</p
><p
>IE8 introduced InPrivate, among a bevy of other features. InPrivate is similar to Incognito browsing in Chrome.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/09/17/ie-and-chrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Application-based packet filtering on Linux</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/09/14/application-based-packet-filtering-on-linux/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/09/14/application-based-packet-filtering-on-linux/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 22:08:38 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[admin]]></category>
		<category><![CDATA[quick tips]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=365</guid>
		<description><![CDATA[iptables can&#8217;t filter on process ID or any other &#8220;direct&#8221; application identifier, which means you can&#8217;t say things like, &#8220;Allow only Firefox to send/receive any packets.&#8221; However, it can filter on user/group ID, allowing you to do user-based packet filtering, so that you can at least restrict applications if you run them as a certain [...]]]></description>
			<content:encoded><![CDATA[<p
><a href="http://www.netfilter.org/"
  >iptables</a
  > can&rsquo;t filter on process ID or any other &ldquo;direct&rdquo; application identifier, which means you can&rsquo;t say things like, &ldquo;Allow only Firefox to send/receive any packets.&rdquo; However, it can filter on user/group ID, allowing you to do user-based packet filtering, so that you can at least restrict applications if you run them as a certain uid/gid. The owner module (xt_owner) matches the owner of the socket (<code
  >man iptables</code
  > for more details).</p
><pre
><code
  ># iptables -m owner --help
iptables v1.4.4
[...]
owner match options:
[!] --uid-owner userid[-userid]      Match local UID
[!] --gid-owner groupid[-groupid]    Match local GID
[!] --socket-exists                  Match if socket exists
</code
  ></pre
><p
>Of course, this all applies only to local sockets; if this system is serving as a router for other hosts, then you don&rsquo;t have the uid/gid information for their sockets (if their OS even has those notions).</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/09/14/application-based-packet-filtering-on-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HOWTO: Crack Yahoo&#8217;s Intranet</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/08/21/howto-crack-yahoos-intranet/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/08/21/howto-crack-yahoos-intranet/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 00:59:13 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=352</guid>
		<description><![CDATA[Ben Reed gave me a run-down of how he managed to win Yahoo&#8217;s internal Crack Day by getting into the corporate network and making commits to their code repositories, all using off-the-shelf tools and without writing a line of code. These flaws have been fixed by now.The first step is to associate with the wireless [...]]]></description>
			<content:encoded><![CDATA[<p
><a href="http://research.yahoo.com/Benjamin_Reed"
  >Ben Reed</a
  > gave me a run-down of how he managed to win Yahoo&rsquo;s internal Crack Day by getting into the corporate network and making commits to their code repositories, all using off-the-shelf tools and without writing a line of code. These flaws have been fixed by now.</p
><p
>The first step is to associate with the wireless network. The network is secured using WEP, which is straightforward to crack using <a href="http://wepcrack.sourceforge.net/"
  >WEPCrack</a
  >. This can be done from anywhere near the campus premises, and it took Ben at most 30 minutes.</p
><p
>Yahoo uses Cisco VPN and Aruba VPN. Cisco VPN turns out to be <a href="http://unixwiz.net/techtips/iguide-ipsec.html"
  >IPsec</a
  > with extensions, and Yahoo&rsquo;s is configured to use pre-shared keys (as opposed to certificates/PKI). It&rsquo;s also configured to use <em
  >aggressive mode</em
  > for a faster three-packet initial key exchange, as opposed to <em
  >main mode</em
  >, which uses six packets but is more secure. From the excellent <a href="http://csrc.nist.gov/publications/nistpubs/800-77/sp800-77.pdf"
  >NIST Guide to IPsec VPNs</a
  >:</p
><blockquote
><p
  >&hellip;unlike main mode, aggressive mode can be used with pre-shared secret key authentication for hosts without fixed IP addresses. However, with the increased speed of aggressive mode comes decreased security. Since the Diffie-Hellman key exchange begins in the first packet, the two parties do not have an opportunity to negotiate the Diffie-Hellman parameters. Also, the identity information is not always hidden in aggressive mode, so an observer could determine which parties were performing the negotiation. (Aggressive mode can conceal identity information in some cases when public keys have already been exchanged.) Aggressive mode negotiations are also susceptible to pre-shared key cracking, which can allow user impersonation and man-in-the-middle attacks. Another potential issue is that while all IPsec devices must support main mode, aggressive mode support is optional. Unless there are performance issues, it is generally recommended to use main mode for the phase one exchange.</p
  ></blockquote
><p
>The flaws were <a href="https://www.usenix.org/publications/login/1999-12/features/harmful.html"
  >pointed out back in 1999</a
  >:</p
><blockquote
><p
  >Aggressive mode does not usually provide identity protection, as this option is not required to be implemented. The identities can be exchanged in the clear, before a common shared-secret has been established. This is considered a feature for mobile users. Yet it is mobile users who are most likely to be affected by eavesdropping on wireless links. Such revealed identities are long-term liabilities. Compromised identities continue to be useful to an adversary until all participants have revoked the associated permissions. Identity attacks are extremely easy and may be mounted from anywhere on the Internet. Moreover, the revealed identities might be encrypted in other exchanges. This provides a ripe opportunity for cryptanalysis of those exchanges. This fundamental design flaw is inherent in the specification, and remediation will require removal of the aggressive mode feature.</p
  ></blockquote
><p
>Windows laptops are required to use the Aruba VPN client, of which we know nothing. Only Macs use the Cisco VPN client, so we need to find some Macs; this can be done with passive <a href="http://en.wikipedia.org/wiki/TCP/IP_stack_fingerprinting"
  >OS fingerprinting</a
  > tools like <a href="http://lcamtuf.coredump.cx/p0f.shtml"
  >p0f</a
  > by <a href="http://lcamtuf.coredump.cx/"
  >Michal Zalewski</a
  >.</p
><p
>Now we can use <a href="http://en.wikipedia.org/wiki/ARP_spoofing"
  >ARP spoofing</a
  > to fool the Macs into thinking we&rsquo;re the gateway and sending all their packets through us. Ben used <a href="http://www.arpoison.net/"
  >ARPoison</a
  >. Make sure you&rsquo;ve activated IP forwarding on your system so that you actually route packets.</p
><p
>Once we&rsquo;re the man in the middle, we can use <a href="http://www.roe.ch/FakeIKEd"
  >FakeIKEd</a
  > to nab the credentials:</p
><blockquote
><p
  >FakeIKEd, or <code
    >fiked</code
    > for short, is a fake IKE daemon supporting just enough of the standards and Cisco extensions to attack commonly found insecure Cisco PSK+XAUTH VPN setups in what could be described as a semi MitM attack. Fiked can impersonate a VPN gateway&rsquo;s IKE responder in order to capture XAUTH login credentials; it doesn&rsquo;t currently do the client part of full MitM.</p
  ></blockquote
><p
>One problem is that you need to tell <code
  >fiked</code
  > the shared key. You can get this by grabbing a copy of Yahoo&rsquo;s VPN client from Yahoo Frontyard, which is Yahoo&rsquo;s external-facing site for employees. However, the site requires a valid login and is served over HTTPS. The trick is that it installs an authenticator cookie, which is also sent along with non-HTTPS requests to other yahoo.com sites.</p
><p
>Note that the VPN system has since been reconfigured, and now uses certificates/PKI to avoid MITM attacks. Furthermore, the VPN authentication has been augmented with <a href="http://en.wikipedia.org/wiki/SecurID"
  >RSA SecurID</a
  >, which provides a rolling token for two-factor authentication. This complicates the attack, though SecurID is still vulnerable to MITM attacks executed within the appropriate timeframe.</p
><p
>Once you&rsquo;re in the corporate network, you can mount user home directories which are exported over NFS. Permissions are not enforced over NFS (which is designed to be used by a trusted set of hosts, but apparently the NFS servers here don&rsquo;t use any such list of hosts), so you can assume any user ID and touch anyone&rsquo;s files&mdash;including their SSH <code
  >authorized_keys</code
  > file. Simply drop your public key in <code
  >~filo/.ssh/authorized_keys</code
  >, and you can now log in as <a href="http://en.wikipedia.org/wiki/David_Filo"
  >David Filo</a
  > and (among other things) commit code.</p
><p
>Yahoo has since disabled the ability for <code
  >sshd</code
  > to use users&rsquo; <code
  >authorized_keys</code
  > files and instead has a separate mechanism for adding public keys.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/08/21/howto-crack-yahoos-intranet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows 7 non-impressions</title>
		<link>http://y_z.scripts.mit.edu/wp/2009/07/21/windows-7-non-impressions/</link>
		<comments>http://y_z.scripts.mit.edu/wp/2009/07/21/windows-7-non-impressions/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 09:49:26 +0000</pubDate>
		<dc:creator>yang</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[computing]]></category>

		<guid isPermaLink="false">http://y_z.scripts.mit.edu/wp/?p=331</guid>
		<description><![CDATA[I&#8217;ve been using the free beta release of Windows 7 on my Lenovo X41 Tablet, and during this time I&#8217;ve found that I really don&#8217;t need that many local applications installed. It&#8217;s nice and simple, and everything runs smoothly and quickly (most notably, suspend/hibernate). No IBM/Lenovo software accessories or manually installed device drivers to set [...]]]></description>
			<content:encoded><![CDATA[<p
>I&rsquo;ve been using the free beta release of Windows 7 on my Lenovo X41 Tablet, and during this time I&rsquo;ve found that I really don&rsquo;t need that many local applications installed. It&rsquo;s nice and simple, and everything runs smoothly and quickly (most notably, suspend/hibernate). No IBM/Lenovo software accessories or manually installed device drivers to set up or get in the way. I think the only thing which I could imagine missing is the IBM accelerometer-based hard disk protector.</p
><p
>I installed the system by blindly following <a href="http://icrontic.com/articles/install-windows-7-from-usb-using-windows-xp"
  >these instructions</a
  > to create a bootable USB from the DVD ISO under Windows XP (most instructions assume Windows Vista or Windows 7). The only hitch during setup was that the system doesn&rsquo;t have out-of-box support for my Intel PRO/Wireless 2200BG network adapter; I needed to run Windows Update over an Ethernet cable first. Another annoyance, but unrelated to Windows 7, was that I had to defragment my (NTFS-formatted) partition some ten times over before I could ntfsresize it (with an Ubuntu live USB) to make space for Windows 7.</p
><p
>Here&rsquo;s the shortlist of applications that I actually installed:</p
><ul
><li
  ><a href="http://www.google.com/chrome"
    >Chrome</a
    >: &ldquo;mostly-FLOSS&rdquo; browser of choice</li
  ><li
  ><a href="http://get.adobe.com/flashplayer/"
    >Flash</a
    >: not FLOSS, but your alternative is to live under a rock</li
  ><li
  ><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/"
    >PuTTY</a
    >: standard SSH client</li
  ><li
  ><a href="http://blog.kowalczyk.info/software/sumatrapdf/"
    >Sumatra PDF</a
    >: a PDF viewer that&rsquo;s much lighter weight than Acrobat</li
  ></ul
><p
>And that&rsquo;s it! No Java. No IM or email client&mdash;these run on my main desktop, but even if they didn&rsquo;t, I&rsquo;d just use Gmail/Meebo/etc. No IDE or dev tools&mdash;I do most of my development over SSH. No office suite&mdash;I just don&rsquo;t use these applications much anymore, and probably also because I&rsquo;ve moved most of my document authoring to LaTeX or Pandoc or what have you. I imagine I&rsquo;ll be crawling back to Powerpoint 2007 once I have to crank out another presentation, though&mdash;it&rsquo;s just easy, fast, and pretty.</p
><p
>I didn&rsquo;t even need to download the Consolas font, since it&rsquo;s included in Windows 7.</p
><p
>Over time, I can imagine myself also installing the following:</p
><ul
><li
  ><a href="http://filezilla.sf.net/"
    >Filezilla</a
    >: use it mainly for SFTP</li
  ><li
  ><a href="http://www.tightvnc.com/"
    >TightVNC</a
    >: so I can connect to my desktop for apps like Thunderbird</li
  ><li
  ><a href="http://www.videolan.org/"
    >VideoLAN Client</a
    >: because it somehow manages to play any video I throw at it, but until I actually need to watch a movie on my laptop, I usually find myself watching Hulu and Youtube</li
  ><li
  ><a href="http://www.vuze.com/"
    >Vuze</a
    >: downloading media wirelessly <a href="http://y_z.scripts.mit.edu/wp/2008/11/24/practical-media-downloading/"
    >may be safer</a
    >, and Vuze is still the best BT client with features that matter (faster downloads, resilient tracking, search); goes well with <a href="http://phoenixlabs.org/pg2/"
    >PeerGuardian</a
    ></li
  ></ul
><p
>I thought I&rsquo;d have more to say about Windows 7 by this point, but I honestly still haven&rsquo;t experienced it that deeply. (The fact that it&rsquo;s out of my way is just as well a Good Thing, but where&rsquo;s the fun in that?) That, plus the fact that I don&rsquo;t have many local apps, lets me realize first-hand that the significance of the laptop/netbook OS is becoming marginalized, and that Chrome OS/Android/Linux really could become relevant. The paradox is that native mobile device apps&mdash;like those written for the iPhone OS&mdash;are popular and preferred over their web counterparts, and I think that has more to do with generally less-connected usage of these devices and the not-quite-as-slick UI of most web apps.</p
><p
>I elected to try Windows 7 primarily for fun, but also to keep at least some part of myself familiar with the dominant desktop OS of the world, and lastly because it just has better tablet support, battery life, and suspend/hibernate compared to my prior experiences with Linux on the laptop.</p
>
]]></content:encoded>
			<wfw:commentRss>http://y_z.scripts.mit.edu/wp/2009/07/21/windows-7-non-impressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
